home *** CD-ROM | disk | FTP | other *** search
- /*-------------------------------
- | Kommando-Zeile: Optionen laden
- | Damit man nicht immer denselben
- | Quark schreiben muß...
- --------------------------------*/
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <tos.h>
-
- #include "tools.h"
-
-
- /*-----
- | Sizes
- -------*/
- #define PATH_SIZE 200
- #define NAME_SIZE 14
-
-
- /*-----------------
- | globale Variablen
- -------------------*/
- long act_fil_sz;
- char *local_path = NULL;
-
-
- /*--------
- | atexit:
- ----------*/
- void free_lp( void );
-
-
- /*------------------------------------------------------------------
- | Alle Optionen einlesen.
- | Ausgabe: Anzahl der Optionen
- | == Index auf erste non-option in argv
- | wenn format == prg_name [o1] [o2] [..] Parameter )
- --------------------------------------------------------------------*/
- int get_options( int argc, char **argv)
- {
- int c;
- int pos;
-
- for( c = 1; c < argc; c++ )
- {
- /*--------------
- | Welche Option?
- ----------------*/
- pos = get_index( argv[c] );
-
- /*-------------------
- | nix mehr -> Abbruch
- ---------------------*/
- if( pos < 0 )
- { break;
- }
-
- /*----------------------------
- | Wert berechnen und speichern
- ------------------------------*/
- liste[pos].value = liste[pos].function( argv[c] + strlen(liste[pos].option));
- liste[pos].valid = TRUE;
- }
-
- return c;
- }
-
-
- /*---------------------------------
- | Index in optionen-Liste ermitteln
- -----------------------------------*/
- int get_index( char *p )
- {
- int c;
- int ret;
-
- /*---------------------
- | Default: nix gefunden
- -----------------------*/
- ret = -1;
-
- /*-----------------
- | Liste durchsuchen
- -------------------*/
- for( c = 0; liste[c].function != NULL; c++ )
- {
- /*---------------------
- | Gefunden?
- | Index merken und raus
- -----------------------*/
- if( strncmp( p, liste[c].option, strlen( liste[c].option) ) == 0 )
- { ret = c;
- break;
- }
- }
-
- return ret;
- }
-
-
-
- /*---------------------------------------------------
- | Umwandlungsroutinen
- -----------------------------------------------------*/
- void *get_number( char *p )
- {
- return (void *)atoi( p );
- }
-
- void *get_string( char *p )
- {
- return (void *)p;
- }
-
-
- /*--------------------------------------------------------------------
- | File-IO-Routinen
- ----------------------------------------------------------------------*/
-
- /*-------------------------------------------------------------------
- | File öffnen
- | laden (ganz),
- | schließen.
- |
- |
- | Eingaben: Pfad, Name, Modus.
- | Ausgaben: Adresse des Speicherbereichs, in den die Daten geladen wurden.
- | Länge des Files steht
- | - in globaler Variablen (long) act_fil_sz
- | - bei Adresse - sizeof(long).
- | Fehler: Adresse = NULL;
- | act_fil_sz=-1;
- |------------------------------------------------------------------
- | NB: File entfernen immer mit unload_file().
- -------------------------------------------------------------------*/
- void *load_file(char *pfad, char *name, char *mode)
- {
- FILE *fp;
- long size;
- char *p;
-
- if( (fp=open_file(pfad, name, mode)) == NULL)
- {
- act_fil_sz=-1l;
- return NULL;
- }
-
- size=fsize(fp);
- p=(char *)malloc( size+sizeof(long) );
- if(p==NULL)
- {
- close_file(fp);
- act_fil_sz=-1l;
- return NULL;
- }
-
- size = 0L;
- /*---------------------------
- | File einlesen, Bytes zählen
- -----------------------------*/
- while( fread( p + sizeof( long )+ size, 1, 1, fp ) != 0L )
- { size++;
- }
-
- close_file(fp);
- act_fil_sz=size;
- *(long *)p=size;
-
- return (void *)(p+sizeof(long));
- }
-
-
-
- /*-------------------------------------------------------------------
- | Ein mit load_file() geladenes File
- | aus Speicher entfernen.
- | Aktuelle Länge ist dann ungültig!
- -------------------------------------------------------------------*/
- void unload_file(char *p)
- {
- if(p)
- free(p-sizeof(long));
- act_fil_sz=-1l;
- }
-
-
-
-
- /*-------------------------------------------------------------------
- | File öffnen:
- |--------------------------------------------------------------------
- | Eingabe: Pfad, Name und Modus
- | Ausgabe: FILE-Pointer oder NULL bei Fehler
- --------------------------------------------------------------------*/
- FILE *open_file( char *pfad, char *name, const char *mode)
- {
- FILE *fp;
- char dir[PATH_SIZE];
-
- get_path( dir );
-
- set_path( pfad );
- fp=fopen( name, mode);
-
- set_path( dir );
-
- return fp;
- }
-
-
- /*-------------------------------------------------------------------
- | File schließen, der Vollständigkeit halber.
- -------------------------------------------------------------------*/
- int close_file(FILE *fp)
- {
- int err;
-
- if(fp)
- { err=fclose(fp);
- fp=NULL;
- }
- return err;
- }
-
-
-
-
- /* -------------------------------------------------------------------
- | Größe einer Datei ermittteln.
- ------------------------------------------------------------------- */
- long fsize(FILE *fp)
- {
- long pos, size;
-
- pos=fseek(fp, 0, SEEK_CUR);
- fseek(fp, 0, SEEK_END);
- size=ftell(fp);
- fseek(fp, pos, SEEK_SET);
-
- return size;
- }
-
-
- /*----------------------------------
- | Aus Eingabe Pfad und Namen holen.
- | String-Länge muß ausreichend sein.
- ------------------------------------*/
- int get_pn( char *p, char *n, char *inp)
- {
- char *t;
- long h;
-
- /*---------------
- | Namen abtrennen
- -----------------*/
- t = get_name( inp );
- strcpy( n, t );
-
- /*----------------
- | Pfad auch
- ------------------*/
- if( t == inp )
- { strcpy( p, ".");
- }else
- { strncpy( p, inp, h = strlen( inp ) - strlen( n ) );
- p[h] = '\0' ;
- }
-
- return 0;
- }
-
-
-
- /* ---------------------------------------
- | Zeiger auf den Namen im Pfad holen.
- | i.e.: das, was hinter letzte '\\' steht.
- | Muß man selber kopieren!
- -----------------------------------------*/
- char *get_name( char *p)
- {
- char *t;
-
- t = strrchr( p, '\\'); /* Namen suchen */
- if( t == NULL )
- { t = strrchr( p, ':');
- }
-
- if( t == NULL)
- { t = p;
- }else
- { t++;
- }
-
- return t;
- }
-
-
- /*---------------------------------
- | Pfad setzen
- | Mit oder ohne Laufwerk,
- | relativ oder absolut
- |----------------------------------
- | In dieser Routine wird
- | beim ersten Aufruf local_path
- | gesetzt. Relative Pfade beziehen
- | sich immer auf dieses Verzeichnis.
- |
- | NB:
- | relativen Pfaden darf das Laufwerk
- | vorangestellt sein. Darum ist also
- | das LW nicht teil des Pfad-Namens.
- | xxx
- | für jedes LW einen lokalen Pfad merken!
- |----------------------------------
- | Eingabe: String mit Pfad
- | Ausgabe: Neuer Pfad oder
- | NULL bei Fehler
- -----------------------------------*/
- char *set_path( char *d )
- {
- char op[PATH_SIZE], od;
- int drv;
- int ps;
-
- /*-------------------------
- | Altes Drive & Pfad merken
- ---------------------------*/
- od=get_drv();
- get_path( op );
-
- /*------------------------------
- | Wenn noch nicht geschehen:
- | Augenblicklichen Pfad erfragen
- --------------------------------*/
- if( local_path == NULL )
- {
- local_path = (char *)malloc( PATH_SIZE );
- atexit( free_lp );
- get_path( local_path );
- }
-
-
- /*---------------------------------
- | Da fängt der eigentliche Pfad an
- -----------------------------------*/
- ps = 0;
-
- /*----------------
- | Drive angegeben?
- ------------------*/
- if( d[1] == ':' )
- {
- ps = 2;
- drv=toupper(d[0])-'A';
- if( (set_drv(drv) && 1<<drv) == 0 )
- { set_drv( od );
- return NULL;
- }
- }
-
- /*--------------------
- | Relative Pfadangabe:
- | lokalen Pfad setzen
- ----------------------*/
- if( d[ps] == '.' && ( d[ps+1] == '\0' || d[ps+1] == '\\' || d[ps+1] == '.') )
- {
- set_path( local_path );
- }
-
- /*-----------
- | Pfad setzen
- -------------*/
- if( set_dir( &d[ps] ) < 0 )
- { set_drv( od );
- set_dir( op );
- return NULL;
- }
-
- /*-----------------------
- | Der ganze aktuelle Pfad
- -------------------------*/
- get_path( d );
-
- return d;
- }
-
- /*----------------------------------------
- | Speicher des local_path wieder freigeben
- ------------------------------------------*/
- void free_lp( void )
- {
- if( local_path != NULL )
- { free( local_path );
- }
- }
-
- /*-----------------------------------
- | Pfad holen mit Laufwerk:
- |------------------------------------
- | Eingabe: Zeiger auf Speicherbereich
- | Ausgabe: Zeiger auf Speicherbereich
- ------------------------------------*/
- char *get_path(char *p)
- {
- strcpy(p," :");
- p[0]=get_drv()+'A';
-
- get_dir(&p[2], 0);
-
- /*---------------------------------------------------
- | Irgendwo stand mal, (ich denke, in der ST-Computer)
- | ein Pfad müsse IMMER mit '\\' abgeschlossen sein.
- -----------------------------------------------------*/
- if( p[strlen( p )] != '\\' )
- { strcat( p, "\\");
- }
-
- return p;
- }
-
- /*------------------------------------------------------------------
- | TOS abhängig:
- --------------------------------------------------------------------*/
- int get_drv( void )
- { return Dgetdrv( );
- }
-
- long set_drv( int drv )
- { return Dsetdrv( drv );
- }
-
- int set_dir( char *p)
- { return Dsetpath( p );
- }
-
- int get_dir( char *p, int drv)
- { return Dgetpath( p, drv );
- }
-